package com.jackstraw.jack_base.datasource.elasticsearch.service;

import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import com.jackstraw.jack_base.datasource.elasticsearch.entity.ElasticSearchBaseEntity;
import com.jackstraw.jack_base.datasource.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.lang.Nullable;

import java.util.List;

public interface ElasticSearchService<T extends ElasticSearchBaseEntity<T>,
        ER extends ElasticsearchRepository<T>>
        extends InitializingBean {


    ElasticsearchClient elasticsearchClient();

    ElasticsearchAsyncClient elasticsearchAsyncClient();

    /**
     * 创建索引
     *
     * @return
     */
    Boolean createIndex();

    /**
     * 判断索引是否存在
     *
     * @return
     */
    Boolean existsIndex();

    /**
     * 删除所有
     *
     * @return
     */
    Boolean deleteIndex();

    /**
     * 保存一条数据
     *
     * @param t
     * @return
     */
    T save(T t);

    /**
     * 更新一条数据
     *
     * @param t
     * @return
     */
    T update(T t);

    /**
     * 保存多条数据
     *
     * @param tList
     * @return
     */
    List<T> saveAll(@Nullable List<T> tList);

    /**
     * 更新多条数据
     *
     * @param tList
     * @return
     */
    List<T> updateAll(@Nullable List<T> tList);

    /**
     * 查找所有数据
     *
     * @return
     */
    List<T> findAll();

    /**
     * 按照指定排序查找所有数据
     *
     * @param sort
     * @return
     */
    List<T> findAll(Sort sort);

    /**
     * 分页查找所有数据
     * <p>
     * 查询页从下标从0开始
     *
     * @param pageable
     * @return
     */
    Page<T> findAll(Pageable pageable);


    /**
     * 查询ID的集合
     *
     * @param ids
     * @return
     */
    List<T> findAllById(@Nullable Iterable<String> ids);

    /**
     * 通过ID查找
     *
     * @param id
     * @return
     */
    T findById(String id);

    /**
     * 通过实体删除
     *
     * @param entity
     */
    void delete(T entity);

    /**
     * 删除所有数据
     */
    void deleteAll();

    /**
     * 通过ID删除数据
     *
     * @param id
     */
    void deleteById(String id);

    /**
     * 通过id的集合删除数据
     *
     * @param ids
     */
    void deleteAllById(@Nullable Iterable<String> ids);


    /**
     * 通过指定实体类删除数据
     *
     * @param entities
     */
    void deleteAll(@Nullable Iterable<? extends T> entities);

    /**
     * 判断该ID是否存在
     *
     * @param id
     * @return
     */
    Boolean existsById(String id);

    /**
     * 统计数量
     *
     * @return
     */
    Long count();

    /**
     * 指定查询条件
     *
     * @param entity
     * @param fields
     * @param pageable
     * @return
     */
    Page<T> searchSimilar(T entity, @Nullable String[] fields, Pageable pageable);


    /**
     * 指定条件查询
     *
     * @param entity
     * @return
     */
    List<T> search(T entity);


}
